
#include "nane/core/conversion.h"

#include <cstdio>
#include <cstring>

namespace nane
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<>
    bool Conversion::Convert<float, const char*>( float* _value, const char*& _data )
    {
        int result = sscanf(_data, "%f", _value);
        return result != EOF && result > 0;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<>
    bool Conversion::Convert<int, const char*>( int* _value, const char*& _data )
    {
        int result = sscanf(_data, "%d", _value);
        return result != EOF && result > 0;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<>
    bool Conversion::Convert<bool, const char*>( bool* _value, const char*& _data )
    {
        if( _data == NULL || _data[0] == '\0' )
            return false;

        if( _data[1] == '\0' )
        {
            *_value = (_data[0] != '0');
            return true;
        }

        if( strcmp(_data, "false") == 0 )
        {
            *_value = false;
            return true;
        }

        if( strcmp(_data, "true") == 0 )
        {
            *_value = true;
            return true;
        }

        return false;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<>
    bool Conversion::Convert<unsigned int, const char*>( unsigned int* _value, const char*& _data )
    {
        int result = sscanf(_data, "%u", _value);
        return result != EOF && result > 0;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<>
    bool Conversion::Convert<bool, uint32>( bool* _value, uint32& _data )
    {
        *_value = _data != 0;
        return true;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<>
    bool Conversion::Convert<bool, int32>( bool* _value, int& _data )
    {
        *_value = _data != 0;
        return true;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<>
    bool Conversion::Convert<bool, float>( bool* _value, float& _data )
    {
        *_value = _data != 0.0f;
        return true;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
